var fs = require('fs');

/** 字句解析 <? と ?> で区切って、一次元配列に格納 */
var parse = function(data){
	var value = [];
	data.toString().split('?>').map(function(val){
		var part = val.split('<?');
		value.push({'type': 'str', 'value': part[0]});
		if(part.length == 1){
			return;
		}
		if(part[1].charAt(0) == '='){
			value.push({'type': 'var', 'value': part[1].substr(1)});
		}else{
			// TODO for文とか
			// error
		}
	});
	return value;
};

/** 構文解析 if文やfor文を後から追加する */
var makeTree = function(data){
	// TODO for文とか
	return data;
};

/** HTML文字列を生成 */
var explain = function(tree, varSet){
	var html = '';
	for(var i = 0; i<tree.length; i++){
		switch(tree[i].type){
		case 'str':
			html += tree[i].value;
			break;
		case 'var':
			html += varSet[tree[i].value];
			break;
		default:
			// TODO for文とか
			// error
		}
	}
	return html;
};

/** ファイルを読込むページを作る関数 */
exports.makeFilePage = function(type, cache, template, pageError){
	var cacheData = {};
	return function(response, path, varSet){
		if(cache && cacheData[path]){
			/* キャッシュがある場合はキャッシュ内容を表示 */
			var data = cacheData[path];
			if(template){
				data = explain(data, varSet);
			}
			response.end(data);
			return;
		}
		fs.readFile(path, function(err, data){
			if(err){
				/* ファイルが開けなかったら、「存在しないページ」を表示 */
				pageError(response);
				return;
			}
			response.writeHead(
				200,
				{'Content-Type': type}
			);
			if(template){
				/* テンプレ読込みの場合は、解析 */
				data = makeTree(parse(data));
			}
			if(cache){
				/* キャッシュが有効の場合、ファイル内容またはテンプレ解析結果をキャッシュ */
				cacheData[path] = data;
				console.log(cacheData);
			}
			if(template){
				/* テンプレ読込みの場合は、値の埋込み等 */
				data = explain(data, varSet);
			}
			response.end(data);
		});
	};
};

